/*************************************************************************************
*Copyright (c) 2011, Intel Mobile Communications GmbH. 
*All rights reserved.
*
*Redistribution and use in source and binary forms, with or without
*modification, are permitted provided that the following conditions are met:
*    * Redistributions of source code must retain the above copyright
*      notice, this list of conditions and the following disclaimer.
*    * Redistributions in binary form must reproduce the above copyright
*      notice, this list of conditions and the following disclaimer in the
*      documentation and/or other materials provided with the distribution.
*    * Neither the name of the <organization> nor the
*      names of its contributors may be used to endorse or promote products
*      derived from this software without specific prior written permission.
*
*THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
*ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
*WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
*DISCLAIMED. IN NO EVENT SHALL INTEL MOBILE COMMUNICATIONS GMBH. BE LIABLE FOR ANY
*DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
*(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
*LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
*ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
*(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
*SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*************************************************************************************/



#ifndef CEF_SYSTEM_PROPERTIES_H
#define CEF_SYSTEM_PROPERTIES_H
#include <string>
#include <vector>
#ifdef _DEBUG
#include <iostream>
#endif
enum cef_derivation_type {SYNC,MESO,ALIGN};

class cef_clock
{
	protected:
	std::string name;	
	unsigned id;
	std::vector<double>* frequency;
	unsigned skew;
	unsigned derived_from_id;
	cef_derivation_type derivation_type;
	int derivation_phase;
	bool derived;
	public:
	cef_clock();
	cef_clock(std::string,unsigned,std::vector<double>*,unsigned,unsigned,cef_derivation_type,int,bool);
	~cef_clock();
	//Setters
	void setName(std::string);
	void setID(unsigned);
	void setFrequency(std::vector<double>*);
	void setSkew(unsigned);
	void setDerivedID(unsigned);
	void setDerivType(cef_derivation_type);
	void setDerivPhase(int);
	void setDerived(bool);
	//Getters
	std::string getName();
	unsigned getID();
	std::vector<double>* getFrequency();
	unsigned getSkew();
	unsigned getDerivedID();
	cef_derivation_type getDerivType();
	int getDerivPhase();
	bool isDerived();
#ifdef _DEBUG
	void print();
#endif
};

class cef_powernet
{
	protected:
	std::string name;
	unsigned id;
	std::vector<double>* voltage;
	unsigned derived_from_id;
	bool derived;
	public:
	cef_powernet();
	cef_powernet(std::string,unsigned, std::vector<double>*, unsigned, bool);
	~cef_powernet();
	//Setters
	void setName(std::string);
	void setID(unsigned);
	void setVoltage(std::vector<double>*);
	void setDerivedID(unsigned);
	void setDerived(bool);
	//Getters
	std::string getName();
	unsigned getID();
	std::vector<double>* getVoltage();
	unsigned getDerivedID();
	bool isDerived();
#ifdef _DEBUG
	void print();
#endif
};


class cef_system_properties
{
	protected:
	std::pair<double,double>* fp_bounding_box;
	std::vector<cef_clock* >* clocks;
	std::vector<cef_powernet* >* powernets;
	public:
	cef_system_properties();
	cef_system_properties(std::pair<double,double>*,std::vector<cef_clock*>*,std::vector<cef_powernet*>*);
	~cef_system_properties();
	//Setters
	void setBoundingBox(std::pair<double,double>*);
	void setClocks(std::vector<cef_clock*>*);
	void setPowerNets(std::vector<cef_powernet*>*);
	//Getters
	std::pair<double,double>* getBoundingBox();
	std::vector<cef_clock*>* getClocks();
	std::vector<cef_powernet*>* getPowerNets();
#ifdef _DEBUG
	void print();
#endif
};
#endif
